package com.jml.proxy;

import org.springframework.stereotype.Component;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

@Component
public class TestClientProxy {

    /**
     * 返回一个动态代理类
     *
     * @param tclass
     * @param <T>
     * @return
     */
    public static <T> T create(Class<T> tclass) {
        return (T) Proxy.newProxyInstance(
                tclass.getClassLoader(),
                new Class<?>[]{tclass},
                new InvocationHandler() {
                    /**
                     *如果只有就接口就可以这样写，如果对实现类进行代理，需要单独写一个InvocationHandler实现类
                     * 然后对proxy进行赋值，proxy就是接口的实现类
                     */
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("使用jdk动态代理");
                        //动态代理的返回值
                        return 100;
                    }
                });
    }

    public static void main(String[] args) {
        MemberService memberService = TestClientProxy.create(MemberService.class);
        Integer index = memberService.getIndex();
        System.out.println("index:" + index);
    }
}
